package com.jt9003.service.impl;

import com.jt9003.dao.PatientRegistrationMapper;
import com.jt9003.pojo.*;
import com.jt9003.service.P_RegistrationService;
import com.jt9003.utils.PageUtils;
import com.jt9003.utils.RedisUtil;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

//患者挂号
@Service
public class P_RegistrationServiceimpl implements P_RegistrationService {

    //获得Dao层对象
    @Resource
    PatientRegistrationMapper prm;
    //redis工具类
    @Resource
    RedisUtil redisUtil;


    /**
     * 添加挂号单信息和患者信息
     * 判断身份证号在患者表中是否有存在，如果不存在，则添加患者
     * 如果存在相同患者，则不用在患者表添加数据，添加挂号单信息时，添加该患者id即可
     * @param map
     * @return
     */
    @Override
    public int addpatient(Map map) {
        //获取Redis中挂号单的key，将全部Key删除
        Set<String> Keys=redisUtil.keys("midical:P_RegistrationController:selectAll_R:*");
        for (String key:Keys){
            redisUtil.del(key);
        }
        //将map中的数据拿出来
        Patient patient = (Patient) map.get("patient");
        Register register = (Register) map.get("register");
        int count = 0;
        int count1 = 0;
        int count2 = 0;
        //获取随机数
         String number = PageUtils.randomNum();

        //设置随机数进去Register
        register.setRegistrationNumber(number);

        //获取患者身份证判断患者是否已经存在
        String idCard = patient.getIdCard();
        System.out.println("serviceimpl拿到的身份证号=================" + idCard);
        Patient patient1 = prm.selectPatient(idCard);

        if (patient1 != null) {
            //添加挂号单信息
            register.setpId(patient1.getpId());//获取id
            count2 = prm.addRegister(register);
        } else {
            //添加患者信息
            count1 = prm.addPatient(patient);
            //获取返回的患者id
            int pId=patient.getpId();

            //添加挂号单信息
            register.setpId(pId);//获取id
            count2 = prm.addRegister(register);
            //添加患者档案  并且设置建档时间
            Patient_archives patient_archives = new Patient_archives();
            patient_archives.setpId(pId);
            patient_archives.setpBuildDate(new Date());
            count = prm.addpatientArchives(patient_archives);
        }
        return count1 + count2 + count;
    }


    /**
     * 查询所有未交费的挂号单信息
     *
     * @return
     */
    @Override
    public List<Register> selectAll_R(Map map) {
        Object object = redisUtil.get("midical:P_RegistrationController:selectAll_R:"+map);
        if (object!=null){
            return (List<Register>)object;
        }else{
           List<Register> list = prm.select_Register(map);
           redisUtil.set("midical:Register:selectAll_R:"+map,list,3600);
            return list;
        }
        /*List<Register> list = prm.select_Register(map);
        return list;*/
    }

    /**
     * 根据id删除挂号单
     * 如果挂号单的缴费状态是已缴费，则不能删除
     *
     * @param id
     * @return
     */
    @Override
    public int delRegister(Integer id) {
        //获取所有的Key，将全部Key删除
        Set<String> Keys=redisUtil.keys("midical:P_RegistrationController:selectAll_R:*");
        for (String key:Keys){
            redisUtil.del(key);
        }
        return prm.delRegister(id);
    }

    /**
     * 挂号单的批量删除
     *
     * @param id
     * @return
     */
    @Override
    public int delRegisters(String id) {
        //获取所有的Key，将全部Key删除
        Set<String> Keys=redisUtil.keys("midical:P_RegistrationController:selectAll_R:*");
        for (String key:Keys){
            redisUtil.del(key);
        }
        return prm.delRegisters(id);
    }

    /**
     * 查询数据总数
     *
     * @return
     */
    @Override
    public int dataTotal(Map map) {
        return prm.dataTotal(map);
    }

    /**
     * 查询用户中的医生，并且时间是在上下班时间内
     * 从Reids中获取医生数据，如果没有则从数据库拿
     * Redis设置保存时间短，便于更新
     * @param nowTime
     * @return
     */
    @Override
    public List<User1> selectDotor(String nowTime) {
        Object object = redisUtil.get("midical:P_RegistrationController:selectDotor:"+nowTime);
        if (object!=null){
            return (List<User1>)object;
        }else{
            List<User1> list = prm.selectDotor(nowTime);
            redisUtil.set("midical:P_RegistrationController:selectDotor"+nowTime,list,600);
            return list;
        }
      //  return prm.selectDotor(nowTime);
    }

    /**
     * 查询所有诊室
     *
     * @return
     */
    @Override
    public List<Division> selectDivision() {
        Object object = redisUtil.get("midical:P_RegistrationController:selectDivision:");
        if (object!=null){
            return (List<Division>)object;
        }else{
            List<Division> list = prm.selectDivision();
            redisUtil.set("midical:Register:selectDivision:",list,600);
            return list;
        }
      //  return prm.selectDivision();
    }

    /**
     * 修改挂号单和患者数据
     *
     * @param register
     * @return
     */
    @Override
    public int UpdateP_R(Register register) {
        //获取所有的Key，将全部Key删除
        Set<String> Keys=redisUtil.keys("midical:P_RegistrationController:selectAll_R:*");
        for (String key:Keys){
            redisUtil.del(key);
        }
        return prm.upDataR_P(register);
    }
}

